【PHP】抽象クラス(abstract) - 継承を前提としたクラス

【PHP】抽象クラス(abstract) - 継承を前提としたクラス

PHPには抽象クラスと呼ぶ、継承を前提としたクラスがあります。

ここでは、抽象クラスについて解説します。

検証環境

抽象クラス

抽象クラスは“継承(されること)を前提としたクラス”です。

通常のクラスを『具象クラス』と呼びますが、抽象クラスは名前のとおり、具象クラスに比べ抽象度が高い(概念寄りな)クラスになります。

オブジェクトを生成できず、具象クラスで継承して活用します。

一般的にプログラム設計などでクラスの仕様を明確にするために使用し、複数人の開発で実装レベルのルールを作る役割を担います。

基本構文

abstract class クラス名 {
    // クラス定数・クラス変数・クラスメソッド
    // フィールド・メソッド
}

具象クラスの定義と基本的には同じですが、classの前にabstractを記述します。

抽象クラスは具象クラスと同様にクラス定数やクラス変数、クラスメソッド、フィールド、メソッド等を定義することが可能です。

サンプル

<?php

// 人間クラス
___ih_hl_start
abstract class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
}
___ih_hl_end

// 教師クラス
class Teacher extends Person {
    
    // 担当科目
    public $subject;
    
    // コンストラクタ
    public function __construct( $name, $subject ) {
        parent::__construct($name);
        $this->subject = $subject;
    }
    
    // あいさつ
    public function greeting() {
        echo "Hello.\n";
        echo "I'm a " . $this->name . ", a " . $this->subject . " instructor.\n";
    }
    
}

$teacher = new Teacher('TANAKA', 'Programming');
$teacher->greeting();

?>
$ php sample.php
Hello.
I'm a TANAKA, a Programming instructor.

4〜14行目が抽象クラスであるPersonクラスの定義です。

TeacherクラスはPersonクラスを継承し、定義を引き継いでいます。

36〜37行目でオブジェクトを生成し、メソッドを呼び出していますが、実行結果から正常に処理できたことが分かります。

もし、抽象クラスのPersonクラスからオブジェクトを生成しようとし、new Person()と記述するとエラーが発生するので注意しましょう。

演習問題

問題1

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 下記表の3つのクラスを作成する
  • 実行結果になるように各クラスのインスタンスを使う
クラス 英記 継承元 フィールド メソッド
乗り物クラス
(抽象クラス)
Vehicle なし $distance(移動距離)
※ 初期値は0
move()
→ "移動します。"を出力し、$distanceの値を20加算する。
display_distance()
→ $distanceの値を出力
車クラス Car Vehicle なし run()
→ "走行します。"を出力し、$distanceの値を50加算する。
飛行機クラス Airplane Vehicle なし fly()
→ "飛行します。"を出力し、$distanceの値を50加算する。
=====  車クラス  =====
走行します。
走行します。
移動距離 : 100km
===== 飛行機クラス =====
飛行します。
飛行します。
飛行します。
移動距離 : 2400km

問題2

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 下記表の3つのクラスを作成する
  • 実行結果になるように各クラスのインスタンスを使う
クラス 英記 継承元 フィールド メソッド
チケットクラス
(抽象クラス)
Ticket なし $price(料金) display_price()
→ $priceの値を出力
ライブチケット LiveTicket Ticket $place(場所) info()
→ 場所と料金を出力
※ 料金の出力はdisplay_price()を使う
ライブ配信チケット LiveStreamingTicket Ticket $url(URL) info()
→ URLと料金を出力
※ 料金の出力はdisplay_price()を使う
===== ライブチケットクラス =====
場所 : ライブハウス
料金 : 8000円
=====  ライブ配信クラス  =====
URL : https://it-hack.net/live-streaming
料金 : 3000円